//备注：拷贝代码请加上作者信息
//作者：王海涛
//邮箱：1126471088@qq.com
//版本：V1.0.0
#ifndef __RGB_DISPLAY_DRIVER_H__
#define __RGB_DISPLAY_DRIVER_H__

#include "../../../BSP/FSMC_BSP/sdram_bsp.h"
#include "../../../BSP/GPIO_BSP/gpio_bsp.h"
#include "../../../../Tool/Font/font.h"
#include "../../../../Tool/RGB_Convert/RGB_Convert.h"
#include <string.h>

/* 屏幕分辨率 RGB_1024x600  RGB_800x480 RGB_480x320 RGB_480x272 RGB_320x240*/
#define RGB_1024x600


/* 根据液晶数据手册的参数配置 */
#if defined(RGB_1024x600)   // 1024x600配置
    #define RGB_PIXEL_WIDTH   1024 // 屏宽
    #define RGB_PIXEL_HEIGHT  600  // 屏高

    #define HSW               10   // HSYNC宽度
    #define HBP               150  // HSYNC后的无效像素
    #define HFP               160   // HSYNC前的无效像素
    #define VSW               10	   // VSYNC宽度
    #define VBP               13   // VSYNC后的无效行数
    #define VFP               12   // VSYNC前的无效行数
#elif defined(RGB_800x480)  // 800x480配置
    #define RGB_PIXEL_WIDTH   800  // 屏宽
    #define RGB_PIXEL_HEIGHT  480  // 屏高

    #define HSW               40   // HSYNC宽度
    #define HBP               48   // HSYNC后的无效像素
    #define HFP               40   // HSYNC前的无效像素
    #define VSW               5    // VSYNC宽度
    #define VBP               13   // VSYNC后的无效行数
    #define VFP               29   // VSYNC前的无效行数
#elif defined(RGB_480x320)  // 480x320配置
    #define RGB_PIXEL_WIDTH   480  // 屏宽
    #define RGB_PIXEL_HEIGHT  320  // 屏高

    #define HSW               2    // HSYNC宽度
    #define HBP               34   // HSYNC后的无效像素
    #define HFP               34   // HSYNC前的无效像素
    #define VSW               2    // VSYNC宽度
    #define VBP               4    // VSYNC后的无效行数
    #define VFP               4    // VSYNC前的无效行数
#elif defined(RGB_480x272)  // 480x272配置
    #define RGB_PIXEL_WIDTH   480  // 屏宽
    #define RGB_PIXEL_HEIGHT  272  // 屏高

    #define HSW               41   // HSYNC宽度
    #define HBP               13   // HSYNC后的无效像素
    #define HFP               32   // HSYNC前的无效像素
    #define VSW               10   // VSYNC宽度
    #define VBP               2    // VSYNC后的无效行数
    #define VFP               2    // VSYNC前的无效行数
#elif defined(RGB_320x240)  // 320x240配置
    #define RGB_PIXEL_WIDTH   320  // 屏宽
    #define RGB_PIXEL_HEIGHT  240  // 屏高

    #define HSW               30   // HSYNC宽度
    #define HBP               38   // HSYNC后的无效像素
    #define HFP               20   // HSYNC前的无效像素
    #define VSW               3    // VSYNC宽度
    #define VBP               15   // VSYNC后的无效行数
    #define VFP               4    // VSYNC前的无效行数
#else
    #define RGB_PIXEL_WIDTH   800  // 屏宽
    #define RGB_PIXEL_HEIGHT  480  // 屏高

    #define HSW               40   // HSYNC宽度
    #define HBP               48   // HSYNC后的无效像素
    #define HFP               40   // HSYNC前的无效像素
    #define VSW               5    // VSYNC宽度
    #define VBP               13   // VSYNC后的无效行数
    #define VFP               29   // VSYNC前的无效行数
#endif

/* RGB屏引脚配置 */
//R数据线
#define LTDC_R0_GPIO_Port        PortH
#define LTDC_R0_GPIO_Pin         Pin2
#define LTDC_R0_GPIO_AF          AFIO_LTDC

#define LTDC_R1_GPIO_Port        PortH
#define LTDC_R1_GPIO_Pin         Pin3
#define LTDC_R1_GPIO_AF          AFIO_LTDC

#define LTDC_R2_GPIO_Port        PortH
#define LTDC_R2_GPIO_Pin         Pin8
#define LTDC_R2_GPIO_AF          AFIO_LTDC

#define LTDC_R3_GPIO_Port        PortB
#define LTDC_R3_GPIO_Pin         Pin0
#define LTDC_R3_GPIO_AF          AFIO_AF9_LTDC

#define LTDC_R4_GPIO_Port        PortA
#define LTDC_R4_GPIO_Pin         Pin11
#define LTDC_R4_GPIO_AF          AFIO_LTDC

#define LTDC_R5_GPIO_Port        PortA
#define LTDC_R5_GPIO_Pin         Pin12
#define LTDC_R5_GPIO_AF          AFIO_LTDC

#define LTDC_R6_GPIO_Port        PortB
#define LTDC_R6_GPIO_Pin         Pin1
#define LTDC_R6_GPIO_AF          AFIO_AF9_LTDC

#define LTDC_R7_GPIO_Port        PortG
#define LTDC_R7_GPIO_Pin         Pin6
#define LTDC_R7_GPIO_AF          AFIO_LTDC
          
//G数据线
#define LTDC_G0_GPIO_Port        PortE
#define LTDC_G0_GPIO_Pin         Pin5
#define LTDC_G0_GPIO_AF          AFIO_LTDC

#define LTDC_G1_GPIO_Port        PortE
#define LTDC_G1_GPIO_Pin         Pin6
#define LTDC_G1_GPIO_AF          AFIO_LTDC

#define LTDC_G2_GPIO_Port        PortH
#define LTDC_G2_GPIO_Pin         Pin13
#define LTDC_G2_GPIO_AF          AFIO_LTDC

#define LTDC_G3_GPIO_Port        PortG
#define LTDC_G3_GPIO_Pin         Pin10
#define LTDC_G3_GPIO_AF          AFIO_AF9_LTDC

#define LTDC_G4_GPIO_Port        PortH
#define LTDC_G4_GPIO_Pin         Pin15
#define LTDC_G4_GPIO_AF          AFIO_LTDC

#define LTDC_G5_GPIO_Port        PortI
#define LTDC_G5_GPIO_Pin         Pin0
#define LTDC_G5_GPIO_AF          AFIO_LTDC

#define LTDC_G6_GPIO_Port        PortC
#define LTDC_G6_GPIO_Pin         Pin7
#define LTDC_G6_GPIO_AF          AFIO_LTDC

#define LTDC_G7_GPIO_Port        PortI
#define LTDC_G7_GPIO_Pin         Pin2
#define LTDC_G7_GPIO_AF          AFIO_LTDC

//B数据线
#define LTDC_B0_GPIO_Port        PortE
#define LTDC_B0_GPIO_Pin         Pin4
#define LTDC_B0_GPIO_AF          AFIO_LTDC

#define LTDC_B1_GPIO_Port        PortG
#define LTDC_B1_GPIO_Pin         Pin12
#define LTDC_B1_GPIO_AF          AFIO_LTDC

#define LTDC_B2_GPIO_Port        PortD
#define LTDC_B2_GPIO_Pin         Pin6
#define LTDC_B2_GPIO_AF          AFIO_LTDC

#define LTDC_B3_GPIO_Port        PortG
#define LTDC_B3_GPIO_Pin         Pin11
#define LTDC_B3_GPIO_AF          AFIO_LTDC

#define LTDC_B4_GPIO_Port        PortI
#define LTDC_B4_GPIO_Pin         Pin4
#define LTDC_B4_GPIO_AF          AFIO_LTDC

#define LTDC_B5_GPIO_Port        PortA
#define LTDC_B5_GPIO_Pin         Pin3
#define LTDC_B5_GPIO_AF          AFIO_LTDC

#define LTDC_B6_GPIO_Port        PortB
#define LTDC_B6_GPIO_Pin         Pin8
#define LTDC_B6_GPIO_AF          AFIO_LTDC

#define LTDC_B7_GPIO_Port        PortB
#define LTDC_B7_GPIO_Pin         Pin9
#define LTDC_B7_GPIO_AF          AFIO_LTDC

//控制信号线
#define LTDC_CLK_GPIO_Port       PortG
#define LTDC_CLK_GPIO_Pin        Pin7
#define LTDC_CLK_GPIO_AF         AFIO_LTDC

#define LTDC_HSYNC_GPIO_Port     PortI
#define LTDC_HSYNC_GPIO_Pin      Pin10
#define LTDC_HSYNC_GPIO_AF       AFIO_LTDC

#define LTDC_VSYNC_GPIO_Port     PortI
#define LTDC_VSYNC_GPIO_Pin      Pin9
#define LTDC_VSYNC_GPIO_AF       AFIO_LTDC	
	        
#define LTDC_DE_GPIO_Port        PortF
#define LTDC_DE_GPIO_Pin         Pin10
#define LTDC_DE_GPIO_AF          AFIO_LTDC	
	          
//屏控制信号
/* 显示开关 */
#define RGB_DISPLAY_GPIO_Port    PortD
#define RGB_DISPLAY_GPIO_Pin     Pin4
/* 背光控制 */
#define RGB_BACK_GPIO_Port       PortD
#define RGB_BACK_GPIO_Pin        Pin7


/* 每层的颜色要和每层输入的颜色格式一致，2层同时使用时，上层必须设置为ARGB1555格式 */

/* 第一帧缓存地址 */
#define RGB_Frame_Buffer1       (SDRAM_BANK_ADDR)
/* 第二帧缓存地址 */
#define RGB_Frame_Buffer2       (RGB_Frame_Buffer1 + RGB_PIXEL_WIDTH * RGB_PIXEL_HEIGHT * 2)

/* RGB层枚举 */
typedef enum
{
    RGB_Backround_Layer  = 0,// 底层
    RGB_Foreground_Layer = 1,// 顶层
}WHT_RGB_Layer_enum;
	
/*RGB屏默认配置值*/
#define WHT_RGB_DEFAULT_INFO             \
{                                        \
    RGB_PIXEL_WIDTH, RGB_PIXEL_HEIGHT,   \
    0, 0,                                \
    (WHT_Font_Info_t*)&Font_ASCII_12x24, \
    RGB565_WHITE, RGB565_BLACK,          \
    RGB_Frame_Buffer1,                   \
    RGB_Backround_Layer,                 \
}

/*屏幕参数*/
typedef struct
{
    uint16_t X_Length;     //屏幕x轴水平长度
    uint16_t Y_Length;     //屏幕y轴垂直长度
    uint16_t New_Pos_X;    //最新x水平坐标
    uint16_t New_Pos_Y;    //最新y垂直坐标
    WHT_Font_Info_t* Font; //字体选择
    uint16_t BK_Color;     //字体背景色
    uint16_t Font_Color;   //字体颜色
    uint32_t New_Frame_Buffer_Addr;//最新帧缓存地址
    uint32_t New_Layer;    //最新层
}WHT_RGB_Display_Info_t;

typedef struct
{
    WHT_RGB_Display_Info_t* WHT_Info;                                         // 屏幕信息
    void (*WHT_Init)(void);                                                   // 初始化
    void (*WHT_Set_Layer)(WHT_RGB_Layer_enum layer);                          // 设置图层
    void (*WHT_Set_Transparency)(uint8_t transparency);                       // 设置透明度
    void (*WHT_Set_Display_State)(uint8_t back_state, uint8_t display_state); // 设置屏幕显示状态
    void (*WHT_Start_Color_Keying)(uint32_t rgb);                             // 开启颜色键控
    void (*WHT_Stop_Color_Keying)(void);                                      // 关闭颜色键控
    /*自带ASCII字体*/
    uint8_t(*WHT_Set_Font_Row)(uint16_t row, uint16_t pos_x);//指定字体显示在那行row最小0 pos_x最小0
    void (*WHT_Clear_Row)(uint8_t row);                      //清空某行字体
    void (*WHT_Puts)(const char* s);                         //ASCII字符显示
    /* 显示窗口 */
    void (*WHT_Set_Display_Window)(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey);
    /*颜色填充*/
    void (*WHT_Fill_Color)(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t rgb565); // 区域填充颜色
    void (*WHT_Fill_Color_Buffer)(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, const uint16_t* intput_buf);//区域填充数据
}WHT_RGB_Display_Driver_t;

extern const WHT_RGB_Display_Driver_t WHT_RGB_Display_Driver;

#endif /*__RGB_DISPLAY_DRIVER_H__*/
